#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

/**
 * @brief 递归创建目录路径（类似 mkdir -p 命令）
 *
 * 本函数递归创建完整的目录路径，包括所有中间目录。如果目录已存在，不会视为错误。
 * 函数会创建输入路径的所有必要父目录，最终创建目标目录。权限固定为 0755 (rwxr-xr-x)。
 *
 * @param path 要创建的目录路径（绝对或相对路径）
 *
 * @return 执行状态
 *   @retval  0  成功创建所有目录（或目录已存在）
 *   @retval -1  创建失败（内存不足/权限不足等）
 *
 * @note 重要注意事项：
 *  1. 已存在的目录不会报错（EEXIST 错误会被忽略）
 *  2. 权限固定为 0755（rwxr-xr-x）
 *  3. 路径分隔符必须为 '/'（POSIX 标准）
 *  4. 内存分配失败或创建目录失败（非 EEXIST）会返回错误
 *  5. 函数会修改路径字符串的临时副本，但不修改原始输入
 *
 * @example 示例：
 *  mkdir_p("/tmp/a/b/c")    // 创建多级目录
 *  mkdir_p("/tmp/existing") // 处理已存在目录
 */
int mkdir_p(const char *path)
{
	// 尝试直接创建目标目录
	if ( mkdir(path, 0755) == 0 ) return 0;

	// 复制路径（避免修改原始字符串）
	char *tmp = strdup(path);
	if ( !tmp ) return -1;

	char *dir = tmp; 
	char *sep = dir;

	// 逐级创建目录
	while ( (sep = strchr(sep, '/')) )
	{
		*sep = '\0';
		if ( *dir != '\0' && mkdir(dir, 0755) && errno != EEXIST ) { free(tmp); return 0; }
		*sep++ = '/';
	}

	// 创建最后一级目录
	if ( mkdir(dir, 0755) && errno != EEXIST ) { free(tmp); return 0; }

	return 0;
}

int main()
{
	int ret = 0;
	if ( ret = mkdir_p("./aaa/bbb/123/456/7") )
	{
		printf("创建目录失败\n");
	}
	else
	{
		printf("创建目录成功\n");
	}

	return 0;
}
